home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr53 / acmalg01.zip / ACM476.FOR next >
Text File  |  1993-01-01  |  48KB  |  591 lines

  1. C     ALGORITHM 476 COLLECTED ALGORITHMS FROM ACM.                              
  2. C     ALGORITHM APPEARED IN COMM. ACM, VOL. 17, NO. 04,                         
  3. C     P. 220.                                                                   
  4.       SUBROUTINE CURV1(N, X, Y, SLP1, SLPN, YP, TEMP, SIGMA)                    
  5.       INTEGER N                                                                 
  6.       REAL X(N), Y(N), SLP1, SLPN, YP(N), TEMP(N), SIGMA                        
  7. C THIS SUBROUTINE DETERMINES THE PARAMETERS NECESSARY TO                        
  8. C COMPUTE AN INTERPOLATORY SPLINE UNDER TENSION THROUGH                         
  9. C A SEQUENCE OF FUNCTIONAL VALUES. THE SLOPES AT THE TWO                        
  10. C ENDS OF THE CURVE MAY BE SPECIFIED OR OMITTED. FOR ACTUAL                     
  11. C COMPUTATION OF POINTS ON THE CURVE IT IS NECESSARY TO CALL                    
  12. C THE FUNCTION CURV2.                                                           
  13. C ON INPUT--                                                                    
  14. C N IS THE NUMBER OF VALUES TO BE INTERPOLATED (N.GE.2),                        
  15. C X IS AN ARRAY OF THE N INCREASING ABSCISSAE OF THE                            
  16. C FUNCTIONAL VALUES,                                                            
  17. C Y IS AN ARRAY OF THE N ORDINATES OF THE VALUES,(I.E.Y(K)                      
  18. C IS THE FUNCTIONAL VALUE CORRESPONDING TO X(K)),                               
  19. C SLP1 AND SLPN CONTAIN THE DESIRED VALUES FOR THE FIRST                        
  20. C DERIVATIVE OF THE CURVE AT X(1) AND X(N), RESPECTIVELY.                       
  21. C IF THE QUANTITY SIGMA IS NEGATIVE THESE VALUES WILL BE                        
  22. C DETERMINED INTERNALLY AND THE USER NEED ONLY FURNISH                          
  23. C PLACE-HOLDING PARAMETERS FOR SLP1 AND SLPN. SUCH PLACE-                       
  24. C HOLDING PARAMETERS WILL BE IGNORED BUT NOT DESTROYED,                         
  25. C YP IS AN ARRAY OF LENGTH AT LEAST N                                           
  26. C TEMP IS AN ARRAY OF LENGTH AT LEAST N WHICH IS USED FOR                       
  27. C SCRATCH STORAGE,                                                              
  28. C AND                                                                           
  29. C SIGMA CONTAINS THE TENSION FACTOR. THIS IS NON-ZERO AND                       
  30. C INDICATES THE CURVINESS DESIRED. IF ABS(SIGMA) IS NEARLY                      
  31. C ZERO (E.G. .001) THE RESULTING CURVE IS APPROXIMATELY A                       
  32. C CUBIC SPLINE. IF ABS(SIGMA) IS LARGE (E.G. 50.) THE                           
  33. C RESULTING CURVE IS NEARLY A POLYGONAL LINE. THE SIGN                          
  34. C OF SIGMA INDICATES WHETHER THE DERIVATIVE INFORMATION                         
  35. C HAS BEEN INPUT OR NOT. IF SIGMA IS NEGATIVE THE ENDPOINT                      
  36. C DERIVATIVES WILL BE DETERMINED INTERNALLY. A STANDARD                         
  37. C VALUE FOR SIGMA IS APPROXIMATELY 1. IN ABSOLUTE VALUE.                        
  38. C ON OUTPUT--                                                                   
  39. C YP CONTAINS VALUES PROPORTIONAL TO THE SECOND DERIVATIVE                      
  40. C OF THE CURVE AT THE GIVEN NODES.                                              
  41. C N,X,Y,SLP1,SLPN AND SIGMA ARE UNALTERED,                                      
  42.       NM1 = N - 1                                                               
  43.       NP1 = N + 1                                                               
  44.       DELX1 = X(2) - X(1)                                                       
  45.       DX1 = (Y(2)-Y(1))/DELX1                                                   
  46. C DETERMINE SLOPES IF NECESSARY                                                 
  47.       IF (SIGMA.LT.0.) GO TO 50                                                 
  48.       SLPP1 = SLP1                                                              
  49.       SLPPN = SLPN                                                              
  50. C DENORMALIZE TENSION FACTOR                                                    
  51.    10 SIGMAP = ABS(SIGMA)*FLOAT(N-1)/(X(N)-X(1))                                
  52. C SET UP RIGHT HAND SIDE AND TRIDIAGONAL SYSTEM FOR YP AND                      
  53. C PERFORM FORWARD ELIMINATION                                                   
  54.       DELS = SIGMAP*DELX1                                                       
  55.       EXPS = EXP(DELS)                                                          
  56.       SINHS = .5*(EXPS-1./EXPS)                                                 
  57.       SINHIN = 1./(DELX1*SINHS)                                                 
  58.       DIAG1 = SINHIN*(DELS*.5*(EXPS+1./EXPS)-SINHS)                             
  59.       DIAGIN = 1./DIAG1                                                         
  60.       YP(1) = DIAGIN*(DX1-SLPP1)                                                
  61.       SPDIAG = SINHIN*(SINHS-DELS)                                              
  62.       TEMP(1) = DIAGIN*SPDIAG                                                   
  63.       IF (N.EQ.2) GO TO 30                                                      
  64.       DO 20 I=2,NM1                                                             
  65.         DELX2 = X(I+1) - X(I)                                                   
  66.         DX2 = (Y(I+1)-Y(I))/DELX2                                               
  67.         DELS = SIGMAP*DELX2                                                     
  68.         EXPS = EXP(DELS)                                                        
  69.         SINHS = .5*(EXPS-1./EXPS)                                               
  70.         SINHIN = 1./(DELX2*SINHS)                                               
  71.         DIAG2 = SINHIN*(DELS*(.5*(EXPS+1./EXPS))-SINHS)                         
  72.         DIAGIN = 1./(DIAG1+DIAG2-SPDIAG*TEMP(I-1))                              
  73.         YP(I) = DIAGIN*(DX2-DX1-SPDIAG*YP(I-1))                                 
  74.         SPDIAG = SINHIN*(SINHS-DELS)                                            
  75.         TEMP(I) = DIAGIN*SPDIAG                                                 
  76.         DX1 = DX2                                                               
  77.         DIAG1 = DIAG2                                                           
  78.    20 CONTINUE                                                                  
  79.    30 DIAGIN = 1./(DIAG1-SPDIAG*TEMP(NM1))                                      
  80.       YP(N) = DIAGIN*(SLPPN-DX2-SPDIAG*YP(NM1))                                 
  81. C PERFORM BACK SUBSTITUTION                                                     
  82.       DO 40 I=2,N                                                               
  83.         IBAK = NP1 - I                                                          
  84.         YP(IBAK) = YP(IBAK) - TEMP(IBAK)*YP(IBAK+1)                             
  85.    40 CONTINUE                                                                  
  86.       RETURN                                                                    
  87.    50 IF (N.EQ.2) GO TO 60                                                      
  88. C IF NO DERIVATIVES ARE GIVEN USE SECOND ORDER POLYNOMIAL                       
  89. C INTERPOLATION ON INPUT DATA FOR VALUES AT ENDPOINTS.                          
  90.       DELX2 = X(3) - X(2)                                                       
  91.       DELX12 = X(3) - X(1)                                                      
  92.       C1 = -C(DELX12+DELX1)/DELX12/DELX1                                        
  93.       C2 = DELX12/DELX1/DELX2                                                   
  94.       C3 = -DELX1/DELX12/DELX2                                                  
  95.       SLPP1 = C1*Y(1) + C2*Y(2) + C3*Y(3)                                       
  96.       DELN = X(N) - X(NM1)                                                      
  97.       DELNM1 = X(NM1) - X(N-2)                                                  
  98.       DELNN = X(N) - X(N-2)                                                     
  99.       C1 = (DELNN+DELN)/DELNN/DELN                                              
  100.       C2 = -DELNN/DELN/DELNM1                                                   
  101.       C3 = DELN/DELNN/DELNM1                                                    
  102.       SLPPN = C3*Y(N-2) + C2*Y(NM1) + C1*Y(N)                                   
  103.       GO TO 10                                                                  
  104. C IF ONLY TWO POINTS AND NO DERIVATIVES ARE GIVEN, USE                          
  105. C STRAIGHT LINE FOR CURVE                                                       
  106.    60 YP(1) = 0.                                                                
  107.       YP(2) = 0.                                                                
  108.       RETURN                                                                    
  109.       END                                                                       
  110.       FUNCTION CURV2(T, N, X, Y, YP, SIGMA, IT)                                 
  111.       INTEGER N, IT                                                             
  112.       REAL T, X(N), Y(N), YP(N), SIGMA                                          
  113. C THIS FUNCTION INTERPOLATES A CURVE AT A GIVEN POINT                           
  114. C USING A SPLINE UNDER TENSION. THE SUBROUTINE CURV1 SHOULD                     
  115. C BE CALLED EARLIER TO DETERMINE CERTAIN NECESSARY                              
  116. C PARAMETERS.                                                                   
  117. C ON INPUT--                                                                    
  118. C T CONTAINS A REAL VALUE TO BE MAPPED ONTO THE INTERPO-                        
  119. C LATING CURVE.                                                                 
  120. C N CONTAINS THE NUMBER OF POINTS WHICH WERE INTERPOLATED                       
  121. C TO DETERMINE THE CURVE,                                                       
  122. C X AND Y ARE ARRAYS CONTAINING THE ORDINATES AND ABCISSAS                      
  123. C OF THE INTERPOLATED POINTS,                                                   
  124. C YP IS AN ARRAY WITH VALUES PROPORTIONAL TO THE SECOND                         
  125. C DERIVATIVE OF THE CURVE AT THE NODES                                          
  126. C SIGMA CONTAINS THE TENSION FACTOR (ITS SIGN IS IGNORED)                       
  127. C IT IS AN INTEGER SWITCH. IF IT IS NOT 1 THIS INDICATES                        
  128. C THAT THE FUNCTION HAS BEEN CALLED PREVIOUSLY (WITH N,X,                       
  129. C Y,YP, AND SIGMA UNALTERED) AND THAT THIS VALUE OF T                           
  130. C EXCEEDS THE PREVIOUS VALUE. WITH SUCH INFORMATION THE                         
  131. C FUNCTION IS ABLE TO PERFORM THE INTERPOLATION MUCH MORE                       
  132. C RAPIDLY. IF A USER SEEKS TO INTERPOLATE AT A SEQUENCE                         
  133. C OF POINTS, EFFICIENCY IS GAINED BY ORDERING THE VALUES                        
  134. C INCREASING AND SETTING IT TO THE INDEX OF THE CALL.                           
  135. C IF IT IS 1 THE SEARCH FOR THE INTERVAL (X(K),X(K+1))                          
  136. C CONTAINING T STARTS WITH K=1.                                                 
  137. C THE PARAMETERS N,X,Y,YP AND SIGMA SHOULD BE INPUT                             
  138. C UNALTERED FROM THE OUTPUT OF CURV1.                                           
  139. C ON OUTPUT--                                                                   
  140. C CURV2 CONTAINS THE INTERPOLATED VALUE. FOR T LESS THAN                        
  141. C X(1) CURV2 = Y(1). FOR T GREATER THAN X(N) CURV2 = Y(N).                      
  142. C NONE OF THE INPUT PARAMETERS ARE ALTERED.                                     
  143.       S = X(N) - X(1)                                                           
  144. C DENORMALIZE SIGMA                                                             
  145.       SIGMAP = ABS(SIGMA)*FLOAT(N-1)/S                                          
  146. C IF IT.NE.1 START SEARCH WHERE PREVIOUSLY TERMINATED,                          
  147. C OTHERWISE START FROM BEGINNING                                                
  148.       IF (IT.EQ.1) I1 = 2                                                       
  149. C SEARCH FOR INTERVAL                                                           
  150.    10 DO 20 I=I1,N                                                              
  151.         IF (X(I)-T) 20, 20, 30                                                  
  152.    20 CONTINUE                                                                  
  153.       I = N                                                                     
  154. C CHECK TO INSURE CORRECT INTERVAL                                              
  155.    30 IF (X(I-1).LE.T .OR. T.LE.X(1)) GO TO 40                                  
  156. C RESTART SEARCH  AND RESET I1                                                  
  157. C ( INPUT ""IT"" WAS INCORRECT )                                                
  158.       I1 = 2                                                                    
  159.       GO TO 10                                                                  
  160. C SET UP AND PERFORM INTERPOLATION                                              
  161.    40 DEL1 = T - X(I-1)                                                         
  162.       DEL2 = X(I) - T                                                           
  163.       DELS = X(I) - X(I-1)                                                      
  164.       EXPS1 = EXP(SIGMAP*DEL1)                                                  
  165.       SINHD1 = .5*(EXPS1-1./EXPS1)                                              
  166.       EXPS = EXP(SIGMAP*DEL2)                                                   
  167.       SINHD2 = .5*(EXPS-1./EXPS)                                                
  168.       EXPS = EXPS1*EXPS                                                         
  169.       SINHS = .5*(EXPS-1./EXPS)                                                 
  170.       CURV2 = (YP(I)*SINHD1+YP(I-1)*SINHD2)/SINHS +                             
  171.      * ((Y(I)-YP(I))*DEL1+(Y(I-1)-YP(I-1))*DEL2)/DELS                           
  172.       I1 = I                                                                    
  173.       RETURN                                                                    
  174.       END                                                                       
  175.       SUBROUTINE KURV1(N, X, Y, SLP1, SLPN, XP, YP, TEMP, S,                    
  176.      * SIGMA)                                                                   
  177. C THIS SUBROUTINE DETERMINES THE PARAMETERS NECESSARY TO                        
  178. C COMPUTE A SPLINE UNDER TENSION PASSING THROUGH A SEQUENCE                     
  179. C OF PAIRS  (X(1),Y(1)),...,(X(N),Y(N)) IN THE PLANE. THE                       
  180. C SLOPES AT THE TWO ENDS OF THE CURVE MAY BE SPECIFIED OR                       
  181. C OMITTED. FOR ACTUAL COMPUTATION OF POINTS ON THE CURVE IT                     
  182. C IS NECESSARY TO CALL THE SUBROUTINE KURV2.                                    
  183. C ON INPUT--                                                                    
  184. C N IS THE NUMBER OF POINTS TO BE INTERPOLATED (N.GE.2),                        
  185. C X IS AN ARRAY CONTAINING THE N X-COORDINATES OF THE                           
  186. C POINTS,                                                                       
  187. C Y IS AN ARRAY CONTAINING THE N Y-COORDINATES OF THE                           
  188. C POINTS,                                                                       
  189. C SLP1 AND SLPN CONTAIN THE DESIRED VALUES FOR THE SLOPE                        
  190. C OF THE CURVE AT  (X(1),Y(1)) AND  (X(N),Y(N)), RESPEC-                        
  191. C TIVELY. THESE QUANTITIES ARE IN DEGREES AND MEASURED                          
  192. C COUNTERCLOCKWISE FROM THE POSITIVE X-AXIS. THE POSITIVE                       
  193. C SENSE OF THE CURVE IS ASSUMED TO BE THAT MOVING FROM THE                      
  194. C POINT 1 TO POINT N. IF THE QUANTITY SIGMA IS NEGATIVE                         
  195. C THESE SLOPES WILL BE DETERMINED INTERNALLY AND THE USER                       
  196. C NEED ONLY FURNISH PLACE-HOLDING PARAMETERS FOR SLP1 AND                       
  197. C SLPN. SUCH PLACE-HOLDING PARAMETERS WILL BE IGNORED BUT                       
  198. C NOT DESTROYED,                                                                
  199. C XP,YP ARE ARRAYS OF LENGTH AT LEAST N,                                        
  200. C TEMP IS AN ARRAY OF LENGTH AT LEAST N WHICH IS USED FOR                       
  201. C SCRATCH STORAGE,                                                              
  202. C AND                                                                           
  203. C SIGMA CONTAINS THE TENSION FACTOR. THIS IS NON-ZERO AND                       
  204. C INDICATES THE CURVINESS DESIRED. IF ABS(SIGMA) IS VERY                        
  205. C LARGE (E.G. 50.) THE RESULTING CURVE IS VERY NEARLY A                         
  206. C POLYGONAL LINE. THE SIGN OF SIGMA INDICATES WHETHER                           
  207. C SLOPE IN FORMATION HAS BEEN INPUT OR NOT. IF SIGMA IS                         
  208. C NEGATIVE THE END-POINT SLOPES WILL BE DETERMINED                              
  209. C INTERNALLY. A STANDARD VALUE FOR SIGMA IS APPROXIMATELY                       
  210. C 1. IN ABSOLUTE VALUE.                                                         
  211. C ON OUTPUT--                                                                   
  212. C N,X,Y,SLP1,SLPN, AND SIGMA ARE UNALTERED,                                     
  213. C XP AND YP CONTAIN INFORMATION ABOUT THE CURVATURE OF THE                      
  214. C CURVE AT THE GIVEN NODES,                                                     
  215. C AND                                                                           
  216. C S CONTAINS THE POLYGONAL ARCLENGTH OF THE CURVE.                              
  217.       INTEGER N                                                                 
  218.       REAL X(N), Y(N), XP(N), YP(N), TEMP(N), S, SIGMA                          
  219.       DEGRAD = 3.1415926535897932/180.                                          
  220.       NM1 = N - 1                                                               
  221.       NP1 = N + 1                                                               
  222.       DELX1 = X(2) - X(1)                                                       
  223.       DELY1 = Y(2) - Y(1)                                                       
  224.       DELS1 = SQRT(DELX1*DELX1+DELY1*DELY1)                                     
  225.       DX1 = DELX1/DELS1                                                         
  226.       DY1 = DELY1/DELS1                                                         
  227. C DETERMINE SLOPES IF NECESSARY                                                 
  228.       IF (SIGMA.LT.0.) GO TO 70                                                 
  229.       SLPP1 = SLP1*DEGRAD                                                       
  230.       SLPPN = SLPN*DEGRAD                                                       
  231. C SET UP RIGHT HAND SIDES OF TRIDIAGONAL LINEAR SYSTEM FOR XP                   
  232. C AND YP                                                                        
  233.    10 XP(1) = DX1 - COS(SLPP1)                                                  
  234.       YP(1) = DY1 - SIN(SLPP1)                                                  
  235.       TEMP(1) = DELS1                                                           
  236.       S = DELS1                                                                 
  237.       IF (N.EQ.2) GO TO 30                                                      
  238.       DO 20 I=2,NM1                                                             
  239.         DELX2 = X(I+1) - X(I)                                                   
  240.         DELY2 = Y(I+1) - Y(I)                                                   
  241.         DELS2 = SQRT(DELX2*DELX2+DELY2*DELY2)                                   
  242.         DX2 = DELX2/DELS2                                                       
  243.         DY2 = DELY2/DELS2                                                       
  244.         XP(I) = DX2 - DX1                                                       
  245.         YP(I) = DY2 - DY1                                                       
  246.         TEMP(I) = DELS2                                                         
  247.         DELX1 = DELX2                                                           
  248.         DELY1 = DELY2                                                           
  249.         DELS1 = DELS2                                                           
  250.         DX1 = DX2                                                               
  251.         DY1 = DY2                                                               
  252. C ACCUMULATE POLYGONAL ARCLENGTH                                                
  253.         S = S + DELS1                                                           
  254.    20 CONTINUE                                                                  
  255.    30 XP(N) = COS(SLPPN) - DX1                                                  
  256.       YP(N) = SIN(SLPPN) - DY1                                                  
  257. C DENORMALIZE TENSION FACTOR                                                    
  258.       SIGMAP = ABS(SIGMA)*FLOAT(N-1)/S                                          
  259. C PERFORM FORWARD ELIMINATION ON TRIDIAGONAL SYSTEM                             
  260.       DELS = SIGMAP*TEMP(1)                                                     
  261.       EXPS = EXP(DELS)                                                          
  262.       SINHS = .5*(EXPS-1./EXPS)                                                 
  263.       SINHIN = 1./(TEMP(1)*SINHS)                                               
  264.       DIAG1 = SINHIN*(DELS*.5*(EXPS+1./EXPS)-SINHS)                             
  265.       DIAGIN = 1./DIAG1                                                         
  266.       XP(1) = DIAGIN*XP(1)                                                      
  267.       YP(1) = DIAGIN*YP(1)                                                      
  268.       SPDIAG = SINHIN*(SINHS-DELS)                                              
  269.       TEMP(1) = DIAGIN*SPDIAG                                                   
  270.       IF (N.EQ.2) GO TO 50                                                      
  271.       DO 40 I=2,NM1                                                             
  272.         DELS = SIGMAP*TEMP(I)                                                   
  273.         EXPS = EXP(DELS)                                                        
  274.         SINHS = .5*(EXPS-1./EXPS)                                               
  275.         SINHIN = 1./(TEMP(I)*SINHS)                                             
  276.         DIAG2 = SINHIN*(DELS*(.5*(EXPS+1./EXPS))-SINHS)                         
  277.         DIAGIN = 1./(DIAG1+DIAG2-SPDIAG*TEMP(I-1))                              
  278.         XP(I) = DIAGIN*(XP(I)-SPDIAG*XP(I-1))                                   
  279.         YP(I) = DIAGIN*(YP(I)-SPDIAG*YP(I-1))                                   
  280.         SPDIAG = SINHIN*(SINHS-DELS)                                            
  281.         TEMP(I) = DIAGIN*SPDIAG                                                 
  282.         DIAG1 = DIAG2                                                           
  283.    40 CONTINUE                                                                  
  284.    50 DIAGIN = 1./(DIAG1-SPDIAG*TEMP(NM1))                                      
  285.       XP(N) = DIAGIN*(XP(N)-SPDIAG*XP(NM1))                                     
  286.       YP(N) = DIAGIN*(YP(N)-SPDIAG*YP(NM1))                                     
  287. C PERFORM BACK SUBSTITUTION                                                     
  288.       DO 60 I=2,N                                                               
  289.         IBAK = NP1 - I                                                          
  290.         XP(IBAK) = XP(IBAK) - TEMP(IBAK)*XP(IBAK+1)                             
  291.         YP(IBAK) = YP(IBAK) - TEMP(IBAK)*YP(IBAK+1)                             
  292.    60 CONTINUE                                                                  
  293.       RETURN                                                                    
  294.    70 IF (N.EQ.2) GO TO 80                                                      
  295. C IF NO SLOPES ARE GIVEN, USE SECOND ORDER INTERPOLATION ON                     
  296. C INPUT DATA FOR SLOPES AT ENDPOINTS                                            
  297.       DELS2 = SQRT((X(3)-X(2))**2+(Y(3)-Y(2))**2)                               
  298.       DELS12 = DELS1 + DELS2                                                    
  299.       C1 = -C(DELS12+DELS1)/DELS12/DELS1                                        
  300.       C2 = DELS12/DELS1/DELS2                                                   
  301.       C3 = -DELS1/DELS12/DELS2                                                  
  302.       SX = C1*X(1) + C2*X(2) + C3*X(3)                                          
  303.       SY = C1*Y(1) + C2*Y(2) + C3*Y(3)                                          
  304.       SLPP1 = ATAN2(SY,SX)                                                      
  305.       DELNM1 = SQRT((X(N-2)-X(NM1))**2+(Y(N-2)-Y(NM1))**2)                      
  306.       DELN = SQRT((X(NM1)-X(N))**2+(Y(NM1)-Y(N))**2)                            
  307.       DELNN = DELNM1 + DELN                                                     
  308.       C1 = (DELNN+DELN)/DELNN/DELN                                              
  309.       C2 = -DELNN/DELN/DELNM1                                                   
  310.       C3 = DELN/DELNN/DELNM1                                                    
  311.       SX = C3*X(N-2) + C2*X(NM1) + C1*X(N)                                      
  312.       SY = C3*Y(N-2) + C2*Y(NM1) + C1*Y(N)                                      
  313.       SLPPN = ATAN2(SY,SX)                                                      
  314.       GO TO 10                                                                  
  315. C IF ONLY TWO POINTS AND NO SLOPES ARE GIVEN, USE STRAIGHT                      
  316. C LINE SEGMENT FOR CURVE                                                        
  317.    80 XP(1) = 0.                                                                
  318.       XP(2) = 0.                                                                
  319.       YP(1) = 0.                                                                
  320.       YP(2) = 0.                                                                
  321.       RETURN                                                                    
  322.       END                                                                       
  323.       SUBROUTINE KURV2(T, XS, YS, N, X, Y, XP, YP, S, SIGMA)                    
  324.       INTEGER N                                                                 
  325.       REAL T, XS, YS, X(N), Y(N), XP(N), YP(N), S, SIGMA                        
  326. C THIS SUBROUTINE PERFORMS THE MAPPING OF POINTS IN THE                         
  327. C INTERVAL (0.,1.) ONTO A CURVE IN THE PLANE. THE SUBROUTINE                    
  328. C KURV1 SHOULD BE CALLED EARLIER TO DETERMINE CERTAIN                           
  329. C NECESSARY PARAMETERS. THE RESULTING CURVE HAS A PARAMETRIC                    
  330. C REPRESENTATION BOTH OF WHOSE COMPONENTS ARE SPLINES UNDER                     
  331. C TENSION AND FUNCTIONS OF THE POLYGONAL ARCLENGTH PARAMETER                    
  332. C ON INPUT--                                                                    
  333. C T CONTAINS A REAL VALUE OF ABSOLUTE VALUE LESS THAN OR                        
  334. C EQUAL TO 1. TO BE MAPPED TO A POINT ON THE CURVE. THE                         
  335. C SIGN OF T IS IGNORED AND THE INTERVAL (0.,1.) IS MAPPED                       
  336. C ONTO THE ENTIRE CURVE. IF T IS NEGATIVE THIS INDICATES                        
  337. C THAT THE SUBROUTINE HAS BEEN CALLED PREVIOUSLY (WITH ALL                      
  338. C OTHER INPUT VARIABLES UNALTERED) AND THAT THIS VALUE OF                       
  339. C T EXCEEDS THE PREVIOUS VALUE IN ABSOLUTE VALUE. WITH                          
  340. C SUCH INFORMATION THE SUBROUTINE IS ABLE TO MAP THE POINT                      
  341. C MUCH MORE RAPIDLY. THUS IF THE USER SEEKS TO MAP A                            
  342. C SEQUENCE OF POINTS ONTO THE SAME CURVE, EFFICIENCY IS                         
  343. C GAINED BY ORDERING THE VALUES INCREASING IN MAGNITUDE                         
  344. C AND SETTING THE SIGNS OF ALL BUT THE FIRST, NEGATIVE,                         
  345. C N CONTAINS THE NUMBER OF POINTS WHICH WERE INTERPOLATED                       
  346. C TO DETERMINE THE CURVE,                                                       
  347. C X AND Y ARE ARRAYS CONTAINING THE X- AND Y-COORDINATES                        
  348. C OF THE INTERPOLATED POINTS,                                                   
  349. C XP AND YP ARE THE ARRAYS OUTPUT FROM KURV2 CONTAINING                         
  350. C CURVATURE INFORMATION,                                                        
  351. C S CONTAINS THE POLYGONAL ARCLENGTH OF THE CURVE,                              
  352. C SIGMA CONTAINS THE TENSION FACTOR (ITS SIGN IS IGNORED).                      
  353. C THE PARAMETERS N,X,Y,XP,YP,S,AND SIGMA SHOULD BE INPUT                        
  354. C UNALTERED FROM THE OUTPUT OF KURV1.                                           
  355. C ON OUTPUT--                                                                   
  356. C XS AND YS CONTAIN THE X-ANDY-COORDINATES OF THE IMAGE                         
  357. C POINT ON THE CURVE.                                                           
  358. C T,N,X,Y,XP,YP,S, AND SIGMA ARE UNALTERED.                                     
  359. C DENORMALIZE SIGMA                                                             
  360.       SIGMAP = ABS(SIGMA)*FLOAT(N-1)/S                                          
  361. C STRETCH UNIT INTERVAL INTO ARCLENGTH DISTANCE                                 
  362.       TN = ABS(T*S)                                                             
  363. C FOR NEGATIVE T START SEARCH WHERE PREVIOUSLY TERMINATED,                      
  364. C OTHERWISE START FROM BEGINNING                                                
  365.       IF (T.LT.0.) GO TO 10                                                     
  366.       I1 = 2                                                                    
  367.       XS = X(1)                                                                 
  368.       YS = Y(1)                                                                 
  369.       SUM = 0.                                                                  
  370.       IF (T.LE.0.) RETURN                                                       
  371.    10 CONTINUE                                                                  
  372. C DETERMINE INTO WHICH SEGMENT TN IS MAPPED                                     
  373.       DO 30 I=I1,N                                                              
  374.         DELX = X(I) - X(I-1)                                                    
  375.         DELY = Y(I) - Y(I-1)                                                    
  376.         DELS = SQRT(DELX*DELX+DELY*DELY)                                        
  377.         IF (SUM+DELS-TN) 20, 40, 40                                             
  378.    20   SUM = SUM + DELS                                                        
  379.    30 CONTINUE                                                                  
  380. C IF ABS(T) IS GREATER THAN 1., RETURN TERMINAL POINT ON                        
  381. C CURVE                                                                         
  382.       XS = X(N)                                                                 
  383.       YS = Y(N)                                                                 
  384.       RETURN                                                                    
  385. C SET UP AND PERFORM INTERPOLATION                                              
  386.    40 DEL1 = TN - SUM                                                           
  387.       DEL2 = DELS - DEL1                                                        
  388.       EXPS1 = EXP(SIGMAP*DEL1)                                                  
  389.       SINHD1 = .5*(EXPS1-1./EXPS1)                                              
  390.       EXPS = EXP(SIGMAP*DEL2)                                                   
  391.       SINHD2 = .5*(EXPS-1./EXPS)                                                
  392.       EXPS = EXPS1*EXPS                                                         
  393.       SINHS = .5*(EXPS-1./EXPS)                                                 
  394.       XS = (XP(I)*SINHD1+XP(I-1)*SINHD2)/SINHS +                                
  395.      * ((X(I)-XP(I))*DEL1+(X(I-1)-XP(I-1))*DEL2)/DELS                           
  396.       YS = (YP(I)*SINHD1+YP(I-1)*SINHD2)/SINHS +                                
  397.      * ((Y(I)-YP(I))*DEL1+(Y(I-1)-YP(I-1))*DEL2)/DELS                           
  398.       I1 = I                                                                    
  399.       RETURN                                                                    
  400.       END                                                                       
  401.       SUBROUTINE KURVP1(N, X, Y, XP, YP, TEMP, S, SIGMA)                        
  402.       INTEGER N                                                                 
  403.       REAL X(N), Y(N), XP(N), YP(N), TEMP(1), S, SIGMA                          
  404. C THIS SUBROUTINE DETERMINES THE PARAMETERS NECESSARY TO                        
  405. C COMPUTE A SPLINE UNDER TENSION FORMING A CLOSED CURVE IN                      
  406. C THE PLANE AND PASSING THROUGH A SEQUENCE OF PAIRS                             
  407. C (X(1),Y(1)),...,(X(N),Y(N)). FOR ACTUAL COMPUTATION OF                        
  408. C POINTS ON THE CURVE IT IS NECESSARY TO CALL THE SUBROUTINE                    
  409. C KURVP2.                                                                       
  410. C ON INPUT--                                                                    
  411. C N IS THE NUMBER OF POINTS TO BE INTERPOLATED (N.GE.2),                        
  412. C X IS AN ARRAY CONTAINING THE N X-COORDINATES OF THE                           
  413. C POINTS,                                                                       
  414. C Y IS AN ARRAY CONTAINING THE N Y-COORDINATES OF THE                           
  415. C POINTS,                                                                       
  416. C XP,YP ARE ARRAYS OF LENGTH AT LEAST N,                                        
  417. C TEMP IS AN ARRAY OF LENGTH AT LEAST 2*N WHICH IS USED                         
  418. C FOR SCRATCH STORAGE,                                                          
  419. C AND                                                                           
  420. C SIGMA CONTAINS THE TENSION FACTOR. THIS IS A NON-ZERO                         
  421. C QUANTITY (WHOSE SIGN IS IGNORED) WHICH INDICATES THE                          
  422. C CURVINESS DESIRED. IF ABS(SIGMA) IS VERY LARGE (E.G. 50.                      
  423. C ) THE RESULTING CURVE IS VERY A POLYGON. A STANDARD                           
  424. C VALUE FOR SIGMA IS APPROXIMATELY 1. IN ABSOLUTE VALUE.                        
  425. C ON OUTPUT--                                                                   
  426. C N,X,Y, AND SIGMA ARE UNALTERED,                                               
  427. C XP AND YP CONTAIN INFORMATION ABOUT THE CURVATURE OF THE                      
  428. C CURVE AT THE GIVEN NODES,                                                     
  429. C AND                                                                           
  430. C S CONTAINS THE POLYGONAL ARCLENGTH OF THE CURVE.                              
  431.       NM1 = N - 1                                                               
  432.       NP1 = N + 1                                                               
  433. C SET UP RIGHT HAND SIDES OF TRIDIAGONAL (WITH CORNER                           
  434. C ELEMENTS) LINEAR SYSTEM FOR XP AND YP                                         
  435.       DELX1 = X(2) - X(1)                                                       
  436.       DELY1 = Y(2) - Y(1)                                                       
  437.       DELS1 = SQRT(DELX1*DELX1+DELY1*DELY1)                                     
  438.       DX1 = DELX1/DELS1                                                         
  439.       DY1 = DELY1/DELS1                                                         
  440.       XP(1) = DX1                                                               
  441.       YP(1) = DY1                                                               
  442.       TEMP(1) = DELS1                                                           
  443.       S = DELS1                                                                 
  444.       DO 10 I=2,N                                                               
  445.         IP1 = I + 1                                                             
  446.         IF (I.EQ.N) IP1 = 1                                                     
  447.         DELX2 = X(IP1) - X(I)                                                   
  448.         DELY2 = Y(IP1) - Y(I)                                                   
  449.         DELS2 = SQRT(DELX2*DELX2+DELY2*DELY2)                                   
  450.         DX2 = DELX2/DELS2                                                       
  451.         DY2 = DELY2/DELS2                                                       
  452.         XP(I) = DX2 - DX1                                                       
  453.         YP(I) = DY2 - DY1                                                       
  454.         TEMP(I) = DELS2                                                         
  455.         DELX1 = DELX2                                                           
  456.         DELY1 = DELY2                                                           
  457.         DELS1 = DELS2                                                           
  458.         DX1 = DX2                                                               
  459.         DY1 = DY2                                                               
  460. C ACCUMULATE POLYGONAL ARCLENGTH                                                
  461.         S = S + DELS1                                                           
  462.    10 CONTINUE                                                                  
  463.       XP(1) = XP(1) - DX1                                                       
  464.       YP(1) = YP(1) - DY1                                                       
  465. C DENORMALIZE TENSION FACTOR                                                    
  466.       SIGMAP = ABS(SIGMA)*FLOAT(N)/S                                            
  467. C PERFORM FORWARD ELIMINATION ON TRIDIAGONAL SYSTEM                             
  468.       DELS = SIGMAP*TEMP(N)                                                     
  469.       EXPS = EXP(DELS)                                                          
  470.       SINHS = .5*(EXPS-1./EXPS)                                                 
  471.       SINHIN = 1./(TEMP(N)*SINHS)                                               
  472.       DIAG1 = SINHIN*(DELS*.5*(EXPS+1./EXPS)-SINHS)                             
  473.       DIAGIN = 1./DIAG1                                                         
  474.       SPDIG1 = SINHIN*(SINHS-DELS)                                              
  475.       SPDIAG = 0.                                                               
  476.       DO 20 I=1,N                                                               
  477.         DELS = SIGMAP*TEMP(I)                                                   
  478.         EXPS = EXP(DELS)                                                        
  479.         SINHS = .5*(EXPS-1./EXPS)                                               
  480.         SINHIN = 1./(TEMP(I)*SINHS)                                             
  481.         DIAG2 = SINHIN*(DELS*(.5*(EXPS+1./EXPS))-SINHS)                         
  482.         IF (I.EQ.N) GO TO 30                                                    
  483.         DIAGIN = 1./(DIAG1+DIAG2-SPDIAG*TEMP(I-1))                              
  484.         XP(I) = DIAGIN*(XP(I)-SPDIAG*XP(I-1))                                   
  485.         YP(I) = DIAGIN*(YP(I)-SPDIAG*YP(I-1))                                   
  486.         TEMP(N+I) = -DIAGIN*TEMP(NM1+I)*SPDIAG                                  
  487.         IF (I.EQ.1) TEMP(NP1) = -DIAGIN*SPDIG1                                  
  488.         SPDIAG = SINHIN*(SINHS-DELS)                                            
  489.         TEMP(I) = DIAGIN*SPDIAG                                                 
  490.         DIAG1 = DIAG2                                                           
  491.    20 CONTINUE                                                                  
  492.    30 TEMP(NM1) = TEMP(N+NM1) - TEMP(NM1)                                       
  493.       IF (N.EQ.2) GO TO 50                                                      
  494. C PERFORM FIRST STEP OF BACK SUBSTITUTION                                       
  495.       DO 40 I=3,N                                                               
  496.         IBAK = NP1 - I                                                          
  497.         XP(IBAK) = XP(IBAK) - TEMP(IBAK)*XP(IBAK+1)                             
  498.         YP(IBAK) = YP(IBAK) - TEMP(IBAK)*YP(IBAK+1)                             
  499.         TEMP(IBAK) = TEMP(N+IBAK) - TEMP(IBAK)*TEMP(IBAK+1)                     
  500.    40 CONTINUE                                                                  
  501.    50 XP(N) =                                                                   
  502.      * (XP(N)-SPDIG1*XP(1)-SPDIAG*XP(NM1))/(DIAG1+DIAG2+SPDIG1*T                
  503.      * EMP(1)+SPDIAG*TEMP(NM1))                                                 
  504.       YP(N) =                                                                   
  505.      * (YP(N)-SPDIG1*YP(1)-SPDIAG*YP(NM1))/(DIAG1+DIAG2+SPDIG1*T                
  506.      * EMP(1)+SPDIAG*TEMP(NM1))                                                 
  507. C PERFORM SECOND STEP OF BACK SUBSTITUTION                                      
  508.       DO 60 I=1,NM1                                                             
  509.         XP(I) = XP(I) + TEMP(I)*XP(N)                                           
  510.         YP(I) = YP(I) + TEMP(I)*YP(N)                                           
  511.    60 CONTINUE                                                                  
  512.       RETURN                                                                    
  513.       END                                                                       
  514.       SUBROUTINE KURVP2(T, XS, YS, N, X, Y, XP, YP, S, SIGMA)                   
  515.       INTEGER N                                                                 
  516.       REAL T, XS, YS, X(N), Y(N), XP(N), YP(N), S, SIGMA                        
  517. C THIS SUBROUTINE PERFORMS THE MAPPING OF POINTS IN THE                         
  518. C INTERVAL (0.,1.) ONTO A CLOSED CURVE IN THE PLANE. THE                        
  519. C SUBROUTINE KURVP1 SHOULD BE CALLED EARLIER TO DETERMINE                       
  520. C CERTAIN NECESSARY PARAMETERS. THE RESULTING CURVE HAS A                       
  521. C PARAMETRIC REPRESENTATIONBOTH OF WHOSE COMPONENTS ARE                         
  522. C PERIODIC SPLINES UNDER TENSION AND FUNCTIONS OF THE POLY-                     
  523. C GONAL ARCLENGTH PARAMETER.                                                    
  524. C ON INPUT--                                                                    
  525. C T CONTAINS A REAL VALUE OF ABSOLUTE VALUE LESS THAN OR                        
  526. C EQUAL TO 1. TO BE MAPPED TO A POINT ON THE CURVE. THE                         
  527. C SIGN OF T IS IGNORED AND THE INTERVAL (0.,1.) IS MAPPED                       
  528. C ONTO THE ENTIRE CLOSED CURVE. IF T IS NEGATIVE THIS                           
  529. C INDICATES THAT THE SUBROUTINE HAS BEEN CALLED PREVIOUSLY                      
  530. C (WITH ALL OTHER INPUT VARIABLES UNALTERED) AND THAT                           
  531. C THIS VALUE OF T EXCEEDS THE PREVIOUS VALUE IN ABSOLUTE                        
  532. C VALUE. WITH SUCH INFORMATION THE SUBROUTINE IS ABLE TO                        
  533. C MAP THE POINT MUCH MORE RAPIDLY. THUS IF THE USER SEEKS                       
  534. C TO MAP A SEQUENCE OF POINTS ONTO THE SAME CURVE,                              
  535. C EFFICIENCY IS GAINED BY ORDERING THE VALUES INCREASING                        
  536. C IN MAGNITUDE AND SETTING THE SIGNS OF ALL BUT THE FIRST,                      
  537. C NEGATIVE,                                                                     
  538. C N CONTAINS THE NUMBER OF POINTS WHICH WERE INTERPOLATED                       
  539. C TO DETERMINE THE CURVE,                                                       
  540. C X AND Y ARE ARRAYS CONTAINING THE X- AND Y-COORDINATES                        
  541. C OF THE INTERPOLATED POINTS,                                                   
  542. C XP AND YP ARE THE ARRAYS OUTPUT FROM KURVP1 CONTAINING                        
  543. C CURVATURE INFORMATION,                                                        
  544. C S CONTAINS THE POLYGONAL ARCLENGTH OF THE CURVE,                              
  545. C SIGMA CONTAINS THE TENSION FACTOR (ITS SIGN IS IGNORED).                      
  546. C THE PARAMETERS N,X,Y,XP,YP,S AND SIGMA SHOULD BE INPUT                        
  547. C UNALTERED FROM THE OUTPUT OF KURVP1.                                          
  548. C ON OUTPUT--                                                                   
  549. C XS AND YS CONTAIN THE X- AND Y-COORDINATES OF THE IMAGE                       
  550. C POINT ON THE CURVE.                                                           
  551. C T,N,X,Y,XP,YP,S AND SIGMA ARE UNALTERED.                                      
  552. C DENORMALIZE SIGMA                                                             
  553.       SIGMAP = ABS(SIGMA)*FLOAT(N)/S                                            
  554. C STRETCH UNIT INTERVAL INTO ARCLENGTH DISTANCE                                 
  555.       TN = ABS(T*S)                                                             
  556. C FOR NEGATIVE T START SEARCH WHERE PREVIOUSLY TERMINATED,                      
  557. C OTHERWISE START FROM BEGINNING                                                
  558.       IF (T.LT.0.) GO TO 10                                                     
  559.       I1 = 2                                                                    
  560.       SUM = 0.                                                                  
  561.    10 IF (I1.EQ.1) GO TO 50                                                     
  562. C DETERMINE INTO WHICH SEGMENT TN IS MAPPED                                     
  563.       DO 30 I=I1,N                                                              
  564.         DELX = X(I) - X(I-1)                                                    
  565.         DELY = Y(I) - Y(I-1)                                                    
  566.         DELS = SQRT(DELX*DELX+DELY*DELY)                                        
  567.         IF (SUM+DELS-TN) 20, 40, 40                                             
  568.    20   SUM = SUM + DELS                                                        
  569.    30 CONTINUE                                                                  
  570.       I = 1                                                                     
  571.       IM1 = N                                                                   
  572.       DELS = S - SUM                                                            
  573.       GO TO 50                                                                  
  574.    40 IM1 = I - 1                                                               
  575. C SET UP AND PERFORM INTERPOLATION                                              
  576.    50 DEL1 = TN - SUM                                                           
  577.       DEL2 = DELS - DEL1                                                        
  578.       EXPS1 = EXP(SIGMAP*DEL1)                                                  
  579.       SINHD1 = .5*(EXPS1-1./EXPS1)                                              
  580.       EXPS = EXP(SIGMAP*DEL2)                                                   
  581.       SINHD2 = .5*(EXPS-1./EXPS)                                                
  582.       EXPS = EXPS1*EXPS                                                         
  583.       SINHS = .5*(EXPS-1./EXPS)                                                 
  584.       XS = (XP(I)*SINHD1+XP(IM1)*SINHD2)/SINHS +                                
  585.      * ((X(I)-XP(I))*DEL1+(X(IM1)-XP(IM1))*DEL2)/DELS                           
  586.       YS = (YP(I)*SINHD1+YP(IM1)*SINHD2)/SINHS +                                
  587.      * ((Y(I)-YP(I))*DEL1+(Y(IM1)-YP(IM1))*DEL2)/DELS                           
  588.       I1 = I                                                                    
  589.       RETURN                                                                    
  590.       END                                                                       
  591.